package commons;


import commons.AuthenticationBean;
import commons.DbConnection;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.logging.Level;
import java.util.logging.Logger;



/**
 * Klasa po której dziedziczą klasy mające dostęp do bazy danych.
 * @author Michał Budziło
 *
 */
public class AbstractDAO {

	protected Connection conn;
	protected PreparedStatement prepStmt;
	protected Statement stmt;
	protected String query = null;

	protected ResultSet rs;

	/**
	 * Klasa, po której dziedziczą wszystkie klasy dostępu do bazy danych.
	 */
	public AbstractDAO() {
		conn = DbConnection.getConnection();
	}

	/**
	 * Metoda pobiera login aktualnie zalogowanego użytkownika
	 * @return login
	 */
	public String getLogin() {
		 FacesContext context = FacesContext.getCurrentInstance();
		HttpServletRequest myRequest = (HttpServletRequest) context
				.getExternalContext().getRequest();
		HttpSession mySession = myRequest.getSession();
		String login = (String) mySession.getAttribute(AuthenticationBean.AUTH_KEY);
		return login;
	}
        
        
        public Integer getIdBiblioteczny()
        {
         Integer idBiblioteczny=null;
          try {
                    String   query3 = "select uz.ident_biblioteczny  "
                              + "from uzytkownicy uz , dane_logowania  da  "
                              + "where da.ident_biblioteczny = uz.ident_biblioteczny "
                              + "and da.login=?";
                PreparedStatement    prepStmt3 = conn.prepareStatement(query3);
                     prepStmt3.setString(1, getLogin());
                     rs = prepStmt3.executeQuery();

                             
                    if(rs.next())
                    {
                      idBiblioteczny= rs.getInt(1);
                     }else
                     {
                        return null;
                     }
                    
                    return idBiblioteczny;
                    
                } catch (SQLException ex) {
                    error(ex.getMessage());
                    Logger.getLogger(AbstractDAO.class.getName()).log(Level.SEVERE, null, ex);
                }
          
                return null;
        }
        
        public Integer ileWypozyczonychKsiazek()
        {
 
          try {
                       query=" select * "
                              + "from wypozyczenia "
                              + "where ident_biblioteczny=?";
                       System.out.println("moj id bibl :  " +getIdBiblioteczny());
                     prepStmt = conn.prepareStatement(query);
                     prepStmt.setInt(1, getIdBiblioteczny());
                     rs = prepStmt.executeQuery();

                            Integer ile=0; 
                     
                        while(rs.next())
                        {
                            ile+=1;
                            System.out.println(" licznikkk ::::::::: " + ile+" : " + rs.getInt("ident_biblioteczny"));
                            
                        }


                         return ile;
                     
                    
                    
                } catch (SQLException ex) {
                    error(ex.getMessage());
                    Logger.getLogger(AbstractDAO.class.getName()).log(Level.SEVERE, null, ex);
                }
          
                return 0;
        }
        
        
  public Integer ileDoKoncaWypozczenia(Integer idKsiazki) {
       try {

             query= " select data_zwrotu-current_date ile from wypozyczenia where ident_ksiazki=?";
             prepStmt = conn.prepareStatement(query);   
             prepStmt.setInt(1, idKsiazki);
             rs= prepStmt.executeQuery();
             if(rs.next())
             {
                 return rs.getInt("ile");
             }else
             {
                 error("error");
             }
               
                } catch (SQLException ex) {
                    error(ex.getMessage());
                    Logger.getLogger(AbstractDAO.class.getName()).log(Level.SEVERE, null, ex);
                }
       return null;
    }

	

	/**
	 * Metoda zamyka  połączenia.
	 */
	protected void close() {
		try {
			if (rs != null)
				rs.close();
			if (prepStmt != null)
				prepStmt.close();
			if (stmt != null)
				stmt.close();
		} catch (SQLException e) {
			error(e.getErrorCode() + " : " + e.getMessage());
			e.printStackTrace();
		}

	}



	/**
	 * Metoda wysyła do widoku strony komunikat o błędzie z bazy danych
	 * @param error komunikat błędu
	 */
	public void error(String error)
	{
		FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_ERROR, error, "Error message.");
		FacesContext.getCurrentInstance().addMessage(null, facesMsg);
		
	}
}
